/*
 * Bloque.cpp
 *
 *  Created on: 06/09/2011
 *      Author: gisedaye
 */

#include "Bloque.h"

Bloque::Bloque(int nro) {
	this->numero=nro;
	this->cantidadRegistros=0;
	this->registros= new list<Registro*>;
}
Bloque::Bloque() {
	this->registros= new list<Registro*>;
}
void Bloque::agregarRegistro(Registro * reg){
	this->registros->push_back(reg);
	this->cantidadRegistros++;
}

int  Bloque::getCantidadRegistros()
{
    return cantidadRegistros;
}

int  Bloque::getEspacioLibre()
{
    return espacioLibre;
}

int  Bloque::getNumero()
{
    return numero;
}

list<Registro*> * Bloque::getRegistros()
{
    return registros;
}

void  Bloque::setCantidadRegistros(int cantidadRegistros)
{
    this->cantidadRegistros = cantidadRegistros;
}

void  Bloque::setEspacioLibre(int espacioLibre)
{
    this->espacioLibre = espacioLibre;
}

void Bloque::setNumero(int numero)
{
    this->numero = numero;
}

void Bloque::setRegistros(list<Registro*> *registros)
{
    this->registros = registros;
}
void Bloque::levantarBloque(string strBloque){
	unsigned int i=0;
	int attr=0;
	while(i<strBloque.length()){
		string aux="";

		while((strBloque[i]!='|')and(i<strBloque.length())){
			aux+=strBloque[i];
			i++;
		}
		if(attr==0){
			this->numero=this->strToInt(aux);
			attr++;
		}else{
			if(attr=1){
				this->cantidadRegistros=this->strToInt(aux);
				attr++;
			}else{
				this->setRegistrosString(aux);
				attr++;
			}
		}

	}
}
void Bloque::setRegistrosString(string strRegistros){
	unsigned int i=0;
	while(i<strRegistros.length()){
			string aux="";
			while((strRegistros[i]!='|')and(i<strRegistros.length())){
				aux+=strRegistros[i];
				i++;
			}
			Registro * reg= new Registro();
			reg->llenarRegistro(aux);
			this->registros->push_back(reg);
		}

}
string Bloque::bloqueString(){
	string strBloque;
	strBloque=this->intToStr(this->numero)+'|'+this->intToStr(this->cantidadRegistros)+this->getListaRegistrosString();
	return strBloque;
}
string Bloque::getListaRegistrosString(){
	string strRegistro;
	list<Registro*>::iterator it;
	for(it=this->registros->begin();it!=this->registros->end();it++){
		if(it==this->registros->begin())
			strRegistro+='|'+(*it)->registroString();
		else
			strRegistro+=(*it)->registroString();
	}

	return strRegistro;
}
int Bloque::strToInt(string s){
	int i;
	istringstream ss( s );
	ss >> i;
	return i;


}
string Bloque::intToStr(int i){
	string s;
	stringstream out;
	out << i;
	s = out.str();

	return s;
}
bool Bloque::estaLleno(int tamanio){
	return tamanio>=this->tamanioBloque();
}
int Bloque::tamanioBloque(){
	int tamanio=sizeof this->numero;
	tamanio+=sizeof this->cantidadRegistros;
	tamanio+=this->tamanioListaRegistros();
	return tamanio;
}

int Bloque::tamanioListaRegistros(){
	list<Registro*>::iterator it;
	int tamanio=0;
	if(this->registros->size()>0){
		for(it=this->registros->begin();it!=this->registros->end();it++){
			tamanio+=(*it)->getTamanioRegistro();
		}
	}
	return tamanio;
}
Bloque::~Bloque() {
	delete this->registros;
	// TODO Auto-generated destructor stub
}
